package ge.util;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 
 * @author Grupo 8
 *
 */
public class Data {
	private GregorianCalendar data;
	private int dia;
	private int mes;
	private int ano;
	/**
	 * 
	 * @param data
	 * String da data( Ex: "12/10/2010" )
	 * @throws Exception
	 */
	public Data(String data) throws Exception{
		data = data.trim();
		verificaData(data);
		String[] array = data.split("/");

		GregorianCalendar dataReal = new GregorianCalendar();
		int anoCorrente = dataReal.get(Calendar.YEAR);
		if(Integer.parseInt(array[2]) > dataReal.get(Calendar.YEAR) || Integer.parseInt(array[2]) < 1900){
			throw new Exception("Este ano nao e o ano corrente");
		}
		dataReal.set(Calendar.YEAR, Integer.parseInt(array[2]));
		dataReal.set(Calendar.MONTH, Integer.parseInt(array[1]) - 1);
		dataReal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(array[0]));
		this.dia = dataReal.get(Calendar.DAY_OF_MONTH);
		this.mes = (dataReal.get(Calendar.MONTH) + 1);
		this.ano = dataReal.get(Calendar.YEAR);
		this.data = dataReal;
	}

	private void verificaData(String data2) throws Exception {
		if (!(validaFormato(data2))){
			throw new Exception("A data deve ser no formato dd/mm/yyyy");
		}
		if(!(validaDataValida(data2))){
			throw new Exception("A data nao e valida");
		}
		
	}
	public String toString() {
		String dia = Integer.toString(data.get(Calendar.DAY_OF_MONTH));
		String mes = Integer.toString(data.get(Calendar.MONTH) + 1);
		String ano = Integer.toString(data.get(Calendar.YEAR));
		return dia + "/" + mes + "/" + ano;
	}
	/**
	 * 
	 * @param data
	 * String da data( Ex: "12/10/2010" )
	 * @throws Exception
	 */
	public void setData(String data) throws Exception {
		verificaData(data);
		String[] array = data.split("/");
		GregorianCalendar dataReal = new GregorianCalendar();
		dataReal.set(Calendar.YEAR, Integer.parseInt(array[2]));
		dataReal.set(Calendar.MONTH, Integer.parseInt(array[1]) - 1);
		dataReal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(array[0]));
		this.dia = dataReal.get(Calendar.DAY_OF_MONTH);
		this.mes = dataReal.get(Calendar.MONTH) + 1;
		this.ano = dataReal.get(Calendar.YEAR);
		this.data = dataReal;

		
	}
	/**
	 * 
	 * @return O dia
	 */
	public int getDia() {
		return dia;
	}
	/**
	 * 
	 * @param dia 
	 * Inteiro representando o dia
	 * @throws Exception
	 */
	public void setDia(int dia) throws Exception {

		String sep = "/";
		String data = dia + sep + getMes() + sep +  ano;
		verificaData(data);
		this.data.set(Calendar.DAY_OF_MONTH, dia);
		this.dia = dia;
	}
	/**
	 * 
	 * @return O mes
	 */
	public int getMes() {
		
		return mes;
	}
	/**
	 * 
	 * @param mes O inteiro que representa um mes
	 * @throws Exception
	 */
	public void setMes(int mes) throws Exception {
		String sep = "/";
		String data = dia + sep + mes + sep +  ano;
		verificaData(data);
		this.data.set(Calendar.MONTH, mes - 1 );
		this.mes = this.data.get(Calendar.MONTH) + 1;
		}
	/**
	 * 
	 * @return O ano
	 */
	public int getAno() {
		return ano;
	}
	/**
	 * 
	 * @param ano String que representa o ano
	 * @throws Exception
	 */
	public void setAno(int ano) throws Exception {
		String sep = "/";
		String data = dia + sep + mes + sep + ano;
		verificaData(data);
		this.data.set(Calendar.YEAR, ano);
		this.ano = ano;
	}
	private boolean validaDataValida(String data2) throws Exception {
		String[] array = data2.split("/");
		GregorianCalendar calendario = new GregorianCalendar();
		calendario.setLenient(false);
		calendario.set(Calendar.YEAR, Integer.parseInt(array[2]));
		calendario.set(Calendar.MONTH, Integer.parseInt(array[1]) - 1);
		calendario.set(Calendar.DAY_OF_MONTH, Integer.parseInt(array[0]));
		try {
			calendario.getTimeInMillis();
		} catch (Exception e) {
			return false;

		}return true;

	}

	private boolean validaFormato(String data2) throws Exception {
		String[] array = data2.split("/");
		if(Integer.parseInt(array[2]) < 1900){
			throw new Exception("Ano deve ser Maior que 1900");
		}if(Integer.parseInt(array[1]) <= 9 && !(array[1].contains("0"))){
			array[1] = "0" + array[1];
		}if(Integer.parseInt(array[0]) <= 9 && !(array[0].contains("0"))){
			array[0] = "0" + array[0];
 		}
		data2 = array[0] + "/" + array[1] + "/" + array[2];
		Pattern padrao = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
		Matcher meta = padrao.matcher(data2);
		return meta.matches();
	}
	/**
	 * Verifica se duas datas sao iguais
	 */
	public boolean equals(Object objeto){
		if(!(objeto instanceof Data)){
			return false;
		}
		Data data1 = (Data) objeto;
		if(toString().equals(data1.toString())){
			return true;
		}else{
			return false;
		}
		
	}
	/**
	 * 
	 * @return A data no formato do GregorianCalendar
	 */
	public GregorianCalendar getData() {
		return data;
	}
	public String[] fragmentaData(){
		String[] dataFragmentada = new String[3];
		String data = toString();
		String[] dataF = data.split("/");
		if(dataF[0].length() < 2){
			String dia = dataF[0];
			dataF[0] = "0";
			dataF[0] += dia;
		}
		if(dataF[1].length() < 2){
			String mes = dataF[1];
			dataF[1] = "0";
			dataF[1] += mes; 
		}
		String dataString = dataF[0]+"/"+dataF[1]+"/"+dataF[2];
		
		
		dataFragmentada[0] = dataString.substring(0, 2);
		dataFragmentada[1] = dataString.substring(3, 5);
		dataFragmentada[2] = dataString.substring(6, 9);
		dataFragmentada[2] += dataString.charAt(data.length() - 1);
		return dataFragmentada;
		
	}


}
